// 手动柯里化
function curryIt(fn) {
    return function a(xa) {
        return function b(xb) {
            return function c(xc) {
                return fn.call(this, xa, xb, xc)
            }
        }
    }
}

// 柯里化
function curryIt(fn) {
    // 获取fn参数的数量
    const n = fn.length;
    // 声明一个数组args
    const args = [];
    // 返回一个匿名函数
    return function (arg) {
        // 将 curryIt 后面括号中的参数放入数组
        args.push(arg);
        // 如果args中的参数个数小于fn函数的参数个数，
        // 则执行arguments.callee（其作用是引用当前正在执行的函数，这里是返回的当前匿名函数）。
        if (args.length < n) {
            return arguments.callee;
        } // 否则，返回fn的调用结果
        else {
            return fn.apply(this, args);
        }
    }
}

// 递归
function curryIt(fn) {
    let length = fn.length;
    let args = [];
    const result = function (arg) {
        args.push(arg);
        length--;
        if (length <= 0) {
            return fn.apply(this, args);
        } else {
            return result;
        }
    };

    return result;
}


function or(a, b) {
    return a || b
}

function or(a, b) {
    return !!(a || b)
}